/*
  ODAZone.cpp - 
*/

#include "ODAZone.h"
#include "ODASensor.h"
#include "ODALedPanel.h"
#include "WProgram.h"
#include "ODADebug.h"

Zone::Zone() {
  _sensorsAdded = 0;
  _enabled = false;
  _zone = 0;
}

void Zone::init(uint8_t zone) {
  _zone = zone;
}

void Zone::addSensor(uint8_t pin, uint8_t place) {
  _sensors[_sensorsAdded++].init(pin);
  _sensors[_sensorsAdded-1].setPlace(place);
}

boolean Zone::isAlarm(LedPanel *lp) {
  boolean ret = false;
  for (int s = 0; s < _sensorsAdded; s++) {
    if (_sensors[s].getStatus() == LOW) {
#ifdef __DEBUG
      Serial.print("Port=");
      Serial.println((int)_sensors[s].getPort());
#endif
      ret = true;
      
      //Illumina il led sul pannello
      uint8_t alarmPlace = _sensors[s].getPlace();
      if (alarmPlace > 0) {
        uint8_t alarmPlaceRow = floor(alarmPlace / 5) + 1;
        uint8_t alarmPlaceCol = alarmPlace - ((alarmPlaceRow-1)*5);
        lp->turnOn(alarmPlaceRow,alarmPlaceCol);
      }      
    }
  }
  
  return ret;
}

boolean Zone::enable(LedPanel *lp) {
  _enabled = true;

  //Reset della zona (imposta tutti i sensori come se fossero chiusi)
  reset();
  
  //Prima lettura stato porte
  isAlarm(lp);
  
  //Attesa tempo di debounce
  delay(50);

  //Ritorna true se l'attivazione della zona riporta almeno un sensore "aperto"
  return isAlarm(lp);
}

void Zone::reset() {
  for (int s = 0; s < _sensorsAdded; s++) {
    _sensors[s].reset();
  }
}

void Zone::disable() {
  _enabled = false;
}

boolean Zone::isEnabled() {
  return _enabled;
}